#include <iostream>
#include <string.h>
#include <string>
#include <sstream>
#include <fstream>
using namespace std;
// cow写时复制形式的探讨
// cow: copy on write 写时复制
class CowString{
public:
    // 使用拷贝构造的时候，执行的是浅拷贝
    // 只有真正去写的时候，才执行深拷贝
    CowString(const char *pstr)
    :_pstr(new char[6 + 1]() + 4)
    {
        cout << "CowString(const char *)" << endl;
        strcpy(_pstr,pstr);
        refcount++;
    }

    CowString()
    :_pstr(new char[6 + 1]() + 4)
    {
        refcount++;
        cout << "CowString()" << endl;
    }

    // 拷贝构造函数(浅拷贝即可)
    CowString(const CowString & rhs)
    :_pstr(rhs._pstr) // 浅拷贝
    {
        // 因为使用const修饰拷贝构造函数，不能修改内容
        //++rhs._refcount; 
        ++*(int *)(_pstr - 4);

    }

    // 赋值运算符重载
    CowString & operator+(const CowString & rhs){
        if(this != &rhs){ // 判断是不是字赋值
            // 如果引用计数为1，就要释放
            if(refcount == 0){
                delete [] (_pstr - 4);
            }
            _pstr = rhs._pstr;
            refcount++;
        }
        return *this;
    }

    // 析构函数
    ~CowString(){
        if(refcount == 0){
            cout << "~CowString()" << endl;
            delete [] (_pstr - 4);
        }
    }

    // 返回指向数据内容区域的指针
    const char * c_str() const {
        return _pstr; 
    }

    // 重载输出流
    friend ostream & operator<<(ostream & os,const CowString & rhs);

private:
    char * _pstr;
    int refcount;
};
ostream & operator<<(ostream & os,  const CowString & rhs){
    if(rhs._pstr){
        cout << rhs._pstr;
    }
    return os;
}

void test(){
    CowString c1("hello");
    cout << c1.c_str() << endl;
    CowString c2("word");
    cout << c2.c_str() << endl;
    CowString c3 = c2;
    cout << c3.c_str() << endl;

}

int main(int atgc, char * argv[])
{
    test();
    return 0;
}

